﻿using System;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using SiGeCoPre.Presupuesto_DTO;
using Word = Microsoft.Office.Interop.Word;

namespace SiGeCoPre.Presupuesto_Util
{
    /// <summary>
    /// Clase que exporta como archivo WORD
    /// </summary>
    class ExportarAWord
    {
        private Word.Application wordApp;
        private Word.Document aDoc;
        private object missing = Missing.Value;
        private object filename;

        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="docPath">Determina la ruta de la plantilla</param>
        /// <param name="rutaNueva">Determina la ruta donde copia el archivo</param>
        public ExportarAWord(string docPath, string rutaNueva)
        {
            try
            {
                File.Copy(docPath, rutaNueva,true);
                wordApp = new Word.Application();
                filename = rutaNueva;
                if (File.Exists((string)filename))
                {
                    object readOnly = false;
                    object isVisible = false;
                    wordApp.Visible = false;
                    aDoc = wordApp.Documents.Open(ref filename, ref missing,
                                                  ref readOnly, ref missing, ref missing, ref missing,
                                                  ref missing, ref missing, ref missing, ref missing,
                                                  ref missing, ref isVisible, ref missing, ref missing,
                                                  ref missing, ref missing);
                    aDoc.Activate();
                }
                else
                {
                    MessageBox.Show("El archivo no existe.", "Sin archivo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    Texto.escribirLog("Error en exportarWord");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error durante el proceso. Descripcion: " + ex.Message, "Error Interno", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Texto.escribirLog(ex.Message);
            }
        }

        /// <summary>
        /// Guarda el documento
        /// </summary>
        public void SaveDocument()
        {
            try
            {
                aDoc.Save();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error durante el proceso. Descripcion: " + ex.Message, "Error Interno", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Texto.escribirLog(ex.Message);
            }
        }

        /// <summary>
        /// Cierra el documento
        /// </summary>
        public void CloseDocument()
        {
            object saveChanges = Word.WdSaveOptions.wdSaveChanges;
            wordApp.Quit(ref saveChanges,ref missing,ref missing);
        }

        /// <summary>
        /// Encuentra una palabra y la reemplaza
        /// </summary>
        /// <param name="findText">Determina el texto a encontrar</param>
        /// <param name="replaceText">Texto de reemplazo</param>
        public void FindAndReplace(object findText, object replaceText)
        {
            this.findAndReplace(wordApp, findText, replaceText);
        }

        /// <summary>
        /// Llena un marcador con texto
        /// </summary>
        /// <param name="marcador">Determina el marcador</param>
        /// <param name="texto">Texto a agregar</param>
        public void ReemplazarMarcador(string marcador, string texto)
        {
            this.aDoc.Bookmarks[marcador].Range.Text = texto;
        }

        public void findAndReplace(Word.Application wordApp, object findText, object replaceText)
        {
            object matchCase = true;
            object matchWholeWord = true;
            object matchWildCards = false;
            object matchSoundsLike = false;
            object matchAllWordForms = false;
            object forward = true;
            object format = false;
            object matchKashida = false;
            object matchDiacritics = false;
            object matchAlefHamza = false;
            object matchControl = false;
            object read_only = false;
            object visible = true;
            object replace = 2;
            object wrap = 1;
            wordApp.Selection.Find.Execute(ref findText, ref matchCase,ref matchWholeWord,
                                           ref matchWildCards, ref matchSoundsLike, ref matchAllWordForms,
                                           ref forward, ref wrap, ref format, ref replaceText, ref replace,
                                           ref matchKashida, ref matchDiacritics,ref matchAlefHamza, ref matchControl);
        }

        /// <summary>
        /// Crea tabla con los datos de la tareas de mantenimiento
        /// </summary>
        /// <param name="pm">Objeto con los datos de las tareas</param>
        public void crearTablaMantenimiento(presupuestoMantenimientoDTO pm)
        {
            int i = 1;
            int count = 0;
            foreach (string tarea in pm.Tarea)
            {
                this.wordApp.ActiveDocument.Tables[1].Rows.Add(this.wordApp.ActiveDocument.Tables[1].Rows[i]);
                this.wordApp.ActiveDocument.Tables[1].Cell(i, 1).Range.Text = tarea;
                this.wordApp.ActiveDocument.Tables[1].Cell(i, 2).Range.Text = pm.DescripcionTarea[count];
                i++;
                count++;
            }
        }

        /// <summary>
        /// Crea tabla con los repuestos
        /// </summary>
        /// <param name="pr">Objeto con los datos de los repuestos</param>
        public void crearTablaRepuestos(presupuestoRepuestoDTO pr)
        {
            int i = 1;
            int count = 0;
            foreach (string codigo in pr.CodigoRepuesto)
            {
                this.wordApp.ActiveDocument.Tables[1].Rows.Add(this.wordApp.ActiveDocument.Tables[1].Rows[i]);
                this.wordApp.ActiveDocument.Tables[1].Cell(i, 1).Range.Text = codigo;//codigo
                this.wordApp.ActiveDocument.Tables[1].Cell(i, 2).Range.Text = pr.DescripcionRepuesto[count];//descripcion
                this.wordApp.ActiveDocument.Tables[1].Cell(i, 3).Range.Text = pr.PrecioUnitario[count].ToString();//precio unitario
                this.wordApp.ActiveDocument.Tables[1].Cell(i, 4).Range.Text = pr.Cantidad[count].ToString();//cantidad
                this.wordApp.ActiveDocument.Tables[1].Cell(i, 5).Range.Text = pr.PrecioTotal[count].ToString();//precio total
                i++;
                count++;
            }
        }
    }
}
